/**
 * 代理模式：是一种设计模式，用于为其他对象提供一种代理，以控制对这个对象的访问；
 * 主要是为了在不改变原始对象的情况下，提供额外的功能和控制。和装饰器模式类似，都是为其他对象提供代理，但是代理的功能不同。
 * 比如，代理模式可以用于控制对原始对象的访问，而装饰器模式可以用于为原始对象提供额外的功能。
 */
public class ProxyPattern {
    public static void main(String[] args) {
        ProxySubject proxySubject = new ProxySubject();
        proxySubject.operation();
    }
}
// 原始对象
class RealSubject {
    public void operation() {
        System.out.println("会唱跳rap");
    }
}
// 代理对象
class ProxySubject {
    private RealSubject realSubject;

    public void operation() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        //和装饰器模式的区别就是代理对象和原始对象关联，客户端无法直接访问原始对象
        preOperation();
        realSubject.operation();
        postOperation();
    }

    private void preOperation() {
        System.out.println("代理对象做一些准备工作");
    }

    private void postOperation() {
        System.out.println("代理对象做一些收尾工作");
    }
}
